package com.song.springclouddemoshardingjdbc.config.shardingjdbc.algorithm;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import java.util.*;


// 数据库分片算法，实现精确的分片算法
public class BirthdayAlgorithm implements PreciseShardingAlgorithm<Date> {
    List<Date> dateList = new ArrayList<>();
    {
        // 分几个库就写几个
        Calendar calendar1 = Calendar.getInstance();
        calendar1.set(2023, 1, 1, 0, 0, 0);  //小于23年1月1日的都放在db1  23年1月1日也在这个库
        Calendar calendar2 = Calendar.getInstance();
        calendar2.set(2024, 1, 1, 0, 0, 0);  //大于23年1月1日的<24年1月1日的都放在db2
        //Calendar calendar3 = Calendar.getInstance();
        //calendar3.set(2023, 12, 1, 0, 0, 0);

        dateList.add(calendar1.getTime());
        dateList.add(calendar2.getTime());
        //dateList.add(calendar3.getTime());
    }


    //一个是数据库的集合，另一个是精确的分片值。这个方法的目的是根据分片值来决定应该使用哪个数据库。
    //在doSharding方法中，首先获取了分片值（一个日期），然后遍历dateList列表。对于dateList中的每一个日期，如果分片值早于这个日期，就直接返回当前的数据库名。如果分片值晚于所有的日期，就返回最后一个数据库名。
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Date> preciseShardingValue) {
        // 获取属性数据库的值
        Date date = preciseShardingValue.getValue();
        // 获取数据源的名称信息列表
        Iterator<String> iterator = collection.iterator();

        String target = null;
        for (Date s : dateList) {
            target = iterator.next();
            System.out.println("iterator==>"+target);  //ds1
            // 如果数据晚于指定的日期直接返回
            if (date.before(s)) {
                break;
            }
        }
        return target;
    }
}
